#include "head.h"

/* Usage:  */

// 这是一个初始化子进程的函数
// 第一个参数：存储初始化进程的信息
// 第二个参数：代表有几个子进程
// 返回值：0创建子进程成功，-1代表失败
int initPoll(son_status_t *list, int num)
{
    for(int i=0; i<num; i++)
    {
        // 初始化本地socket,用于和子进程通信
        int socket_fd[2];
        socketpair(AF_LOCAL, SOCK_STREAM, 0, socket_fd);

        // 创建一个进程
        pid_t son_id = fork();
        if(son_id == 0)
        {
            // 子进程逻辑
            close(socket_fd[1]);

            // 0读 收信息  1写 发信息
            // 子进程的核心逻辑
            doWorker(socket_fd[0]);
        }else{
            // 父进程逻辑
            list[i].pid = son_id;
            list[i].flag = FREE;
            list[i].local_socket = socket_fd[1];

            close(socket_fd[0]);
        }
    }
    return 0;
}

// 在子进程中，选取一个空闲进程，处理客户端连接
// 第一个参数：父进程记录子进程的信息
// 第二个参数：子进程的个数
// 第三个参数：新的socket对象(新的客户端连接)
// 返回值...:
int toSonNetFd(son_status_t *list, int num, int net_fd)
{
    for(int i =0; i<num; i++)
    {
        if(list[i].flag == FREE)
        {
            // 使用本地的socket传net_fd以及在文件描述符的其他信息
            sendMsg(list[i].local_socket, net_fd);

            list[i].flag = BUSY;
            break;
        }
    }
    return 0;
}
